package config

import (
	"common/helper"
	"database/sql"
	"github.com/shopspring/decimal"
	"strconv"
	"sync"
)

// 互斥锁
var HcMutex sync.Mutex

const (
	CfgForwardingDomain                       = 3   //转发域名
	CfgTurntableSwitch                        = 106 //转盘活动开关，0 关闭 1 开启
	CfgProxyCommiReturnBonusMax               = 107 //周返佣封顶奖励金额(存储过程中有使用)
	CfgBetReturnBonusMax                      = 108 //周投注封顶奖励金额(存储过程中有使用)
	CfgLostReturnBonusMax                     = 109 //周亏损封顶奖励金额(存储过程中有使用)
	CfgDepositReturnBonusMax                  = 110 //周存款封顶奖励金额(存储过程中有使用)
	CfgWithdrawalFees                         = 111 //提现手续费(百分比)
	CfgWithdrawMaxLimit                       = 112 //最大提现金额
	CfgWithdrawMinLimit                       = 113 //最小提现金额
	CfgValidInviteMinDeposit                  = 114 //有效邀请人数最低充值额度
	CfgProxyCommWeekReturnCalcHour            = 115 //周返佣结算时间
	CfgWeekReturnCalcDay                      = 116 //周奖励结算时间 1-7 星期一 到 星期天
	CfgTelegramLink                           = 201 //telegram 链接
	CfgFacebookLink                           = 202 //facebook 链接
	CfgTwitterLink                            = 203 //twitter 链接
	CfgInstagramLink                          = 204 //instagram  链接
	CfgValidInviteIpLimit                     = 205 //有效邀请同IP限制个数
	CfgRegIpLimit                             = 209 //同IP最大注册数
	CfgEvoEnterLimit                          = 210 //视讯游戏准入门槛(账户余额)
	CfgPswErrCntLimit                         = 211 //密码输入错误最大次数
	CfgBlockWay                               = 212 //密码输入错误次数超过最大次数处理方式  0封账号 1限制登录15分钟
	CfgBlockTimeLong                          = 213 //限制登录时长(分钟)
	CfgWagedDisCountCondition                 = 214 //三方游戏有效打码比例配置生效增加累积打码前置条件
	CfgTaxConditionBalance                    = 217 //抽税生效条件:账户余额
	CfgTaxConditionGameWin                    = 218 //抽税生效条件:单次中奖金额
	CfgValidInviteCondition                   = 219 // 有效邀请判断条件 0  首冲 非0 累计
	CfgBetWeekReturnCalcHour                  = 220 //周投注结算时间
	CfgLostWeekReturnCalcHour                 = 221 //周亏损结算时间
	CfgDepositWeekReturnCalcHour              = 222 //周存款结算时间
	CfgAutomaticWithdrawalMultipleLimit       = 223 //自动出款倍数限制
	CfgIsTheProfitAmountDecimal               = 224 //盈利金额是否小数 0 关闭 1 打开
	CfgAppDownloadBonus                       = 225 //玩家APP下载奖励
	CfgGlobalUnbindSwitch                     = 226 //掉绑开关  0 关闭 1 打开
	CfgGlobalTaxSwitch                        = 227 //税收开关  0 关闭 1 打开
	CfgGlobalWagedRateSwitch                  = 228 //打码有效比例开关  0 关闭 1 打开
	CfgGlobalBonusAddWagedSwitch              = 229 //中奖加码开关  0 关闭 1 打开
	CfgUserUpdateDataTimeLong                 = 230 //用户数据更新的时间间隔(分钟)
	CfgProxyCommiReturnDepositMin             = 231 //玩家充值大于此值才累计代理周返佣的基数(存储过程中有使用)
	CfgBetDailyReturnCalcHour                 = 232 //日投注结算时间(小时)
	CfgDailyBetReturnBonusMax                 = 233 //日投注封顶奖励金额(存储过程中有使用)
	CfgValidInviteWagedReq                    = 234 //有效邀请人数条件:最低打码
	CfgChildWagedReturnLevelOneRate           = 235 //代理1级流水返还比例(百分比)
	CfgChildWagedReturnLevelTwoRate           = 236 //代理2级流水返还比例
	CfgChildWagedReturnLevelThreeRate         = 237 //代理3级流水返还比例
	CfgChildWagedReturnCalcHour               = 238 //代理流水还返计算时间(几时)
	CfgFakePgRTPMulti                         = 239 //假PG动态调整RTP倍数
	CfgFakePgRTPValue                         = 240 //假PG动态调整RTP 返奖率
	CfgPlatMaxWin                             = 241 //三方游戏盈利金额上限限制
	CfgUnbindControl                          = 250 //掉绑白名单开关  0 关闭 1 打开
	CfgCardBindLimit                          = 260 //绑卡上限限制
	CfgDepositBonusManually                   = 261 //是否手动领取充值奖励 1 手动 0 自动
	CfgRechargeShareWagedReq                  = 262 //充值分成奖励 打码量要求
	CfgRechargeShareType                      = 263 //充值分成奖励类型  0充值分成奖励 1首冲 2复冲 3首冲 复冲都有奖励
	CfgAgentWagedTimes                        = 264 //代理打码倍数
	CfgFirstDepositBonusWaged                 = 265 //首充邀请梯度奖励 打码量要求
	CfgInvitedBonus                           = 266 //人数邀请奖励
	CfgUnRegControl                           = 267 //官方禁止注册开关  0 关闭 1 打开
	CfgMinPiggy                               = 268 //储蓄罐最低金额
	CfgPiggyBankReturn                        = 269 //储蓄罐回报率
	CfgWithdrawPixType                        = 270 //可提现的PIX类型 1 CPF 2 PHONE 4 EMAIL 8 CNPJ
	CfgSetPixCanWithdraw                      = 271 //关闭提现方式之前的账号是否可提现  0 关闭 不可提现 1可提现 即需要下发给客户端
	CfgDepositCPFSwitch                       = 272 //充值cpf弹窗开关 0 关闭 1 开启
	CfgRechargeHiddenSwitch                   = 273 //复冲隐藏总开关 0关闭 1 开启
	CfgMainWeb                                = 274 //主页面地址
	CfgWagedMode                              = 275 //打码模式 0分批释放模式 1 全部完成模式
	CfgGlobaForbidlUnbind                     = 276 // 全局禁止掉绑开关  0 关闭 1 打开
	CfgAllowChannelSetRtp                     = 277 // 允许渠道后台设置玩家假三方游戏杀率  0 不允许 1 允许(后台使用 游戏不使用 勿删)
	CfgAllowBusiSetRtp                        = 278 // 允许业务员后台设置玩家假三方游戏杀率  0 不允许 1 允许(后台使用 游戏不使用 勿删)
	CfgAllowChannelChargeHidden               = 279 // 允许渠道后台设置隐藏订单配置  0 不允许 1 允许(后台使用 游戏不使用 勿删)
	CfgAllowBusiChargeHidden                  = 280 // 允许业务员后台设置隐藏订单配置  0 不允许 1 允许(后台使用 游戏不使用 勿删)
	CfgSilverTurnTableComs                    = 281 // 白银转盘消耗的幸运点数
	CfgGoldTurnTableComs                      = 282 // 黄金转盘消耗的幸运点数
	CfgDiamondTurnTableComs                   = 283 // 钻石转盘消耗的幸运点数
	CfgBlogerAutomaticWithdrawalMultipleLimit = 284 //博主自动出款倍数限制(1级充值)
	CfgFakePgRewardReturnRate                 = 301 //假pg返奖率
	CfgDepositCountLimit                      = 302 //充值次数限制

)

type TblGameConfig struct {
	Id          string `db:"id" json:"id"`
	CfgType     string `db:"cfg_type"  json:"cfg_type"`
	CfgValue    string `db:"cfg_value"  json:"cfg_value"`
	Description string `db:"description" json:"description"`
	TypeId      string `db:"type_id"  json:"type_id"`
	Class       string `json:"class" db:"class"`
}

type CsGameCfg struct {
	mapGameConfig map[int]TblGameConfig
}

var g_GameCfg CsGameCfg

func GameCfgRemove() {
	HcMutex.Lock()
	defer HcMutex.Unlock()
	g_GameCfg.mapGameConfig = make(map[int]TblGameConfig)
}

func GameCfgSetRow(row *sql.Rows) {
	var tVal TblGameConfig
	var err error
	err = row.Scan(&tVal.CfgType, &tVal.CfgValue, &tVal.Description)
	if err != nil {
		helper.InfoLog("GameCfgSetRow,scan err")
		return
	}
	iCfgType, err := strconv.Atoi(tVal.CfgType)
	if err != nil {
		// 处理错误，例如字符串无法转换为整数
		helper.InfoLog("GameCfgSetRow,change err, %s", err.Error())
		return
	}
	HcMutex.Lock()
	defer HcMutex.Unlock()
	g_GameCfg.mapGameConfig[iCfgType] = tVal
}

func GetGameCfgInt(iType int) int {
	//HcMutex.Lock()
	//defer HcMutex.Unlock()
	fValue := GetGameCfgFloat64(iType)
	return int(fValue)
}

func GetGameCfgFloat64(iType int) float64 {
	HcMutex.Lock()
	defer HcMutex.Unlock()
	value, exists := g_GameCfg.mapGameConfig[iType]
	if !exists {
		return 0
	}

	retVal, _ := strconv.ParseFloat(value.CfgValue, 64)
	return retVal
}

func GetGameCfgDecimal(iType int) decimal.Decimal {
	HcMutex.Lock()
	defer HcMutex.Unlock()
	value, exists := g_GameCfg.mapGameConfig[iType]

	if !exists {
		return decimal.NewFromFloat(0).Div(decimal.NewFromInt(100))
	}

	floatVal, _ := strconv.ParseFloat(value.CfgValue, 64)
	discount := decimal.NewFromFloat(floatVal)

	return discount

}

func GetGameCfgString(iType int) string {
	HcMutex.Lock()
	defer HcMutex.Unlock()
	value, exists := g_GameCfg.mapGameConfig[iType]
	if !exists {
		return ""
	}

	return value.CfgValue
}
